﻿using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Events;
using System.Reflection.Emit;
using Zhaoxi.SerilogSample.IOCLog;
using Zhaoxi.SerilogSample.NoIOCLog;
using LogLevel = Microsoft.Extensions.Logging.LogLevel;
using Microsoft.Extensions.Configuration.Json; // 确保添加此行

#region 使用硬编码形式配置Serilog对象 - 一般不使用这种方式
//Log.Logger = new LoggerConfiguration()
//    .MinimumLevel.Debug() // 设置最小日志级别
//    .MinimumLevel.Override("Microsoft", LogEventLevel.Information) // 重写微软的组件的最小日志级别
//    .WriteTo.Console() // 设置控制台接收器
//    .WriteTo.Async(c => c // 设置一步接收器 - 异步委托中包装的文件接收器
//        .File("Logs/log-.log", rollingInterval: RollingInterval.Day)) // 按照日期拼装log日志文件名
//    .CreateLogger(); // 创建日志对象
#endregion

#region 使用配置文件方式创建日志对象
var configuration = new ConfigurationBuilder() // 读取配置文件服务
    .AddJsonFile("appsettings.json") // 加载log日志配置文件
    .Build(); // 

Log.Logger = new LoggerConfiguration() // log日志服务
    .ReadFrom.Configuration(configuration) // 读取配置对象
    .CreateLogger(); // 创建日志对象
#endregion

#region IOC注册log日志对象
var servicesProvider = new ServiceCollection() // 服务集合
    .AddLogging(builder => // 注册日志服务
    {
        builder.AddSerilog(); // 注册创建的日志对象
    })
    .AddScoped<TestLog>()
    .BuildServiceProvider();
#endregion

#region IOC日志输出
{
    //var logger = servicesProvider.GetRequiredService<ILogger<Program>>();

    //var leveles = (LogLevel[])Enum.GetValues(typeof(LogLevel));
    //var eventId = 1;
    //foreach (var level in leveles)
    //{
    //    logger.Log(level, eventId++, $"这是一条{level}消息");
    //}
}

var testLog = servicesProvider.GetRequiredService<TestLog>();
testLog.Show();
#endregion

#region 非IOC日志输出
{
    TestLog2 testLog2 = new TestLog2();
    testLog2.Show();
}
#endregion


